package com.woniuxy.interceptors;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.woniuxy.annotation.RequrePerms;
import com.woniuxy.entity.utils.ResponseEntity;
import com.woniuxy.jwt.JWTUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;

/**
 * @Author: 马宇航
 * @Do: 认证拦截器
 * @DateTime: 22/06/28/0028 下午 4:25
 * @Component: 成都蜗牛学苑
 **/
@Component
public class AuthInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("Authorization");
        System.out.println("AuthInterceptor.preHandle，拦截器获取的token"+token);
        //handler参数是什么？它是你调用的controller的方法
        if (handler instanceof HandlerMethod){//确保调用的是handle：controller的方法
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();//method就是方法
            //获取方法的注解,判断我们的注解是否存在，存在你才能获取
            if (method.isAnnotationPresent(RequrePerms.class)) {
                RequrePerms requrePerms = method.getDeclaredAnnotation(RequrePerms.class);
                //我们在controller上面写的权限，和我们当前登录人的数据库的权限相比较
                String[] value = requrePerms.value();
                //遍历：shiro的底层,如何去数据库中查询当前用户的角色
                /**
                * 使用token获取用户信息
                **/
//                String uname = JWTUtils.getUname(token);
                //authService.findAllPermsByUsername(uname);//这个就能获取到当前用户的所有权限
                Set<String> myPerms = new HashSet<>();
                // 模拟去数据库中查询当前用户的权限信息
                myPerms.add("order::add");
                myPerms.add("order::search");
                myPerms.add("order::delete");
                myPerms.add("order::update");
                myPerms.add("product::add");
                myPerms.add("product::search");
                myPerms.add("product::delete");
                myPerms.add("product::update");
                for (String perm : value) {
                    //看自定义注解的权限是否存在于set集合中
                    if (myPerms.contains(perm)) {
                        //如果存在，则放行
                       return super.preHandle(request, response, handler);
                    }
                }
                //如果说没有权限，返回友好的提示
                response.setContentType("application/json;charset=utf-8");
                response.getWriter().write(new ObjectMapper().writeValueAsString(ResponseEntity.AUTHFAILED));
                return false;
            }
        }
        return super.preHandle(request, response, handler);
    }
}
